import streamlit as st
import pandas as pd
import plotly.express as px

# 标题
st.title("📊 学生成绩分析系统")

# 侧边栏
with st.sidebar:
    st.header("筛选条件")
    min_score = st.slider("最低分数", 0, 100, 60)
    show_failed = st.checkbox("仅显示不及格")


# 加载数据  这里使用streamlit自带的缓存优化
# @st.cache_data 装饰器
# 什么是装饰器？在不改变函数的基础上，给函数添加新的功能
# 常见用途：计时（性能检测），安全检查等等
@st.cache_data   # st自带的装饰器，用来缓存数据，下次运行时，会从缓存中读取数据，而不是重新加载数据（缓存优化）
def load_data():
    return pd.read_csv("./grades.csv")


df = load_data()

# 根据侧边栏的选项，筛选数据
# 及格数据
filtrate_df = df[df['成绩'] >= min_score]
# 不及格数据
if show_failed:
    filtrate_df = df[df['成绩'] < min_score]

# 主界面
tb1, tb2 = st.tabs(['数据视图', '可视化'])
with tb1:
    st.dataframe(filtrate_df)

with tb2:
    fig = px.pie(filtrate_df,
                 names="班级",
                 title="班级分布")
    st.plotly_chart(fig)
